package com.opNaga.bpmp.artifact;

import com.opNaga.bpmp.BPMPElement;

import java.util.HashSet;
import java.util.Set;

/**
 * User: Junyi BEI
 * Date: 19/01/2012
 * Time: 14:04
 */
public class Group extends Artifact implements Grouper {
  protected Set<BPMPElement> elements = new HashSet<BPMPElement>();

  public Group(BPMPElement... bes) {
    super();
    for(BPMPElement be : bes) {
      if(!addElement(be)) {
        standardMessage(0, be);
      }
    }
    if(elements.isEmpty()) {
      if(!destroy()) {
        standardMessage(-1, this);
      }
    }
  }

  public Group(String t, BPMPElement... bes) {
    super(t);
    for(BPMPElement be : bes) {
      if(!addElement(be)) {
        standardMessage(0, be);
      }
    }
    if(elements.isEmpty()) {
      if(!destroy()) {
        standardMessage(-1, this);
      }
    }
  }

  @Override
  public String getType() {
    return "Group";
  }

  @Override
  public boolean destroy() {
    return super.destroy();
  }

  public boolean addElement(BPMPElement groupableElement) {
    if(!Groupable.class.isAssignableFrom(groupableElement.getClass())) {
      return standardMessage(650, groupableElement);
    }
    if(!((Groupable) groupableElement).addGrouper(this)) {
      return standardMessage(651, groupableElement);
    }
    if(!elements.add(groupableElement)) {
      return standardMessage(652, groupableElement);
    }
    return standardMessage(690, groupableElement);
  }

  public boolean removeElement(BPMPElement groupableElement) {
    if(!Groupable.class.isAssignableFrom(groupableElement.getClass())) {
      return standardMessage(660, groupableElement);
    }
    if(!((Groupable) groupableElement).removeGrouper(this)) {
      return standardMessage(661, groupableElement);
    }
    if(!elements.remove(groupableElement)) {
      return standardMessage(662, groupableElement);
    }
    if(elements.isEmpty()) {
      destroy();
    }
    return standardMessage(691, groupableElement);
  }
}
